package com.deepexps.security.generator;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 代码自动生成器
 *
 * @author moyi
 * @version 1.0
 * @date 2021/11/11 10:59
 */
public class ScannerGenerator {
    /**
     * 设置作者
     */
    private static final String author = "moyi";
    /**
     * 设置包名
     */
    private static final String moduleName = "com.deepexps.security";
    /**
     * 多个前缀可以用逗号隔开，例如 sys_,bs_
     */
    private static final String tablePrefix = "";
    /**
     * 数据库URL
     */
    private static final String url = "jdbc:mysql://localhost:3306/adminsql?useUnicode=true&characterEncoding=utf8";
    /**
     * 数据库用户名
     */
    private static final String username = "root";
    /**
     * 数据库密码
     */
    private static final String passwd = "123456";
    /**
     * 设置生成实体时的公共父类，BaseController
     */
    private static final String superControllerPackageString = "BaseController";

    public static void main(String[] args) {
        FastAutoGenerator.create(url, username, passwd)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .commentDate("yyyy-MM-dd HH:mm:ss")//调整时间格式
                            .outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent(moduleName) // 设置父包名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置mapperXml生成路径
                })
                // 策略配置
                .strategyConfig((scanner, builder) ->
                        builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
                                .addTablePrefix(tablePrefix) // 设置过滤表前缀

                                .entityBuilder()
                                .enableLombok() // 开启Lombok
                                .logicDeleteColumnName("deleted")   // 说明逻辑删除（软删除）是哪个字段
                                .enableTableFieldAnnotation()   // 属性上加说明注解

                                .serviceBuilder()   // service 配置策略
                                .formatServiceFileName("%sService")
                                .formatServiceImplFileName("%sServiceImpl")

                                .controllerBuilder()    // controller 策略配置
                                .formatFileName("%sController")
                                .enableRestStyle()
                                .superClass(superControllerPackageString)// 开启 RestController

                                .mapperBuilder()    //mapper 策略配置
                                .superClass(BaseMapper.class)   // 继承哪个父类
                                .formatMapperFileName("%sMapper")
                                .enableMapperAnnotation()   // @mapper 开启
                                .formatXmlFileName("%sMapper") // xml 名
                                .build())
//                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}

